#include <sys/select.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdbool.h>
#include <signal.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/un.h>

#define HANDSHAKE 		0x00
#define FAIL 			0x01
#define PPD 			0x02
#define PRAID 			0x03
#define PFS 			0x04

#define GETSECTOR 		0x10
#define RTASECTOR 		0x11
#define WRITESECTOR 	0x12
#define WRITESECTOROK   0x13

#define INFO 			0x20
#define CLEAN 			0x21
#define TRACE 			0x22
#define OK	 			0x23
#define CERRADO			0x24
#define TLECTURA		0x25
#define TESCRITURA		0x26

//RESPUESTAS
#define INFOOK 			0x30
#define CLEANOK			0x31
#define TRACEOK			0x32

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
									MACROS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#ifndef _MAXDESC_
		#define _MAXDESC_
		#define MAXDESC( maximo, nuevo ) maximo = ( (maximo > nuevo ) ? maximo : nuevo );
#endif

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
								ESTRUCTURAS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
typedef struct ST_PConsola{
	char	*szPathPPD;
	int		iCilindro;
	int		iHead;
	int		iSector;
	int		iTiempoLectura;
	int		iTiempoEscritura;
	int		iRPM;
	int		iTiempoSalto;
	int		iSectorActual;
	int		tiempoEntreSectores;
	int		sectoresTotales;
	char	szIdPPD[40];
} __attribute__ ((packed)) ST_PConsola;


typedef uint8_t ST_SECTOR[512];

typedef struct ST_NIPC{
    unsigned char     		ucType;
    int32_t            		lPayload;
//    char            		szPayload[600];
    int						sector;
    ST_SECTOR				buffer;
} __attribute__ ((packed)) ST_NIPC;


typedef struct ST_RESPUESTA{
	unsigned char     		ucType;
    int						sector;
    ST_SECTOR				buffer;
} __attribute__ ((packed)) ST_RESPUESTA;

typedef struct ST_CHS{
    int				cilindro;
    int            	cabeza;
    int            	sector;
} __attribute__ ((packed)) ST_CHS;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
							VARIABLES GLOBALES
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

ST_PConsola		stPConsola;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
							FUNCIONES
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

int manejoPPDListen();
int manejoPPDConnect();
void exeConsola();
void FinConsola();
